package 字符串;

import java.util.HashSet;
import java.util.Set;

/**
 * 1：无重复字符的最长子串：
 *  思路：
 *     使用一个滑动窗口代表无重复字符的子串区域， 同时使用一个Set集合判断该区域中是否有重复元素
 */
public class L_2 {
    public int lengthOfLongestSubstring(String s) {
        if (s == null){
            return 0;
        }
        if(s.length() == 1){
            return 1;
        }
        int resMax = 0;
        // 定义滑动窗口的左右边界
        int left = 0, right = 0;
        // 定义Set集合判断是否存在重复元素
        Set<Character> set = new HashSet<>();
        while (right < s.length()){
            // 如果不重复，将当前元素加入到Set集合中去，并且右指针右移
            if (!set.contains(s.charAt(right))){
                set.add(s.charAt(right));
                right++;
            }else {
                // 如果重复，就将左指针右移，并统计当前子串的长度，直到左指针在不重复区域
                set.remove(s.charAt(left));
                resMax = Math.max(resMax, right - left);
                left++;
            }
        }
        // 最后在计算一次，因为最后一次循环中，right指针已经到达了末尾，没有再右移
        return Math.max(resMax, right - left);
    }
}
